package com.neusoft.service.Impl;

import java.sql.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.neusoft.mapper.ClockMapper;
import com.neusoft.po.CalendarPO;
import com.neusoft.service.ClockService;
import com.neusoft.util.DateUtil;
import com.neusoft.vo.ApproveAttendanceVO;
import com.neusoft.vo.Clock;
import com.neusoft.vo.WorkType;
import com.neusoft.vo.insertNextDay4EmpsVO;

@Service
public class ClockServiceImpl implements ClockService {
	@Autowired
	public ClockMapper m;
	// 毫秒值：八小时
	public static final long EIGHTHOUR = 28800000;
	// 毫秒值：30分钟
	public static final long HALFHOUR = 1800000;

	@Override
	public Clock searchClock(Clock clock) {
		return m.searchClock(clock);
	}

	// 上班打卡
	@Override
	public int clockIn(Clock clock) {
		Clock check = m.searchClock(clock);
		if (check.getClockIn_time() == null) {
			return m.clockIn(clock);
		} else {
			return 0;
		}
	}

	// 下班打卡，结算当前用户当日考勤情况
	@Override
	public int clockOut(Clock clock) {
//        将下班时间存入数据库
		Clock check = m.searchClock(clock);
		if (check.getClockOut_time() == null) {
			m.clockOut(clock);
		}
//        获取今日打卡信息
		Clock data = m.getclock(clock);
//        获得当前员工排班信息
		WorkType standard = m.getWorkType(clock.getEmpno());
		System.out.println(data);
		if (data == null) {
//        由于每天0点定时任务生成次日所有数据，故通常情况下data==null不可能发生
			return -1;
		}
//        判断是否矿工
		if (data.getClockOut_time() == null || data.getClockIn_time() == null) {
			data.setState(7);
			m.setState(data);
//            于补签表中生成补签数据
			return m.InsertReattendace(data);
		}
//        判断是否为迟到或早退
		if (data.getClockIn_time().getTime() > standard.getWorkIn_time().getTime() + HALFHOUR) {
//          迟到
			data.setState(5);
			m.setState(data);
			return m.InsertReattendace(data);
		} else if (data.getClockOut_time().getTime() < standard.getWorkOut_time().getTime() - HALFHOUR) {
//          早退
			data.setState(6);
			m.setState(data);
			return m.InsertReattendace(data);
		} else if (data.getClockOut_time().getTime() - data.getClockIn_time().getTime() <= EIGHTHOUR) {
//          小于八小时 也算早退
			data.setState(6);
			m.setState(data);
			return m.InsertReattendace(data);
		} else {
//            其余为正常出勤
			data.setState(4);
			return m.setState(data);
		}
	}

	// 页面载入时 自动查询当前员工所需补签的所有数据
	@Override
	public List<Clock> selectReattendace(int empno) {
		return m.selectReattendace(empno);
	}

	// 单击补签按钮后 将信息存入reattendace表
	@Override
	public int reattendaceCount(Clock clock) {
		return m.reattendaceCount(clock);
	}

	// 为审批者显示所有待审核补签信息
	@Override
	public List<Clock> selectAllEmpReattendance(ApproveAttendanceVO vo) {
		vo.setCurrentPage((vo.getCurrentPage() - 1) * vo.getPageSize());
		return m.selectAllEmpReattendance(vo);
	}

	// 单击“同意”/“批量同意”按钮时，将得到的集合遍历，将restate置为1，state置为8
	@Override
	@Transactional(propagation = Propagation.SUPPORTS)
	public int agree(List<Integer> ids) {
		int i = 0;
		for (Integer id : ids) {
			m.agree(id);
			m.agree2(id);
			i++;
		}
		return i;
	}

	// 单击“拒绝”/“批量拒绝”按钮时，将得到的集合遍历，将restate置为0
	@Override
	@Transactional(propagation = Propagation.SUPPORTS)
	public int refuse(List<Integer> ids) {
		int i = 0;
		for (Integer id : ids) {
			m.refuse(id);
			i++;
		}
		return i;
	}

	// 每日00：00：00 定时任务
	@Override
	public int insertNextDay4Emps() {
		Long lo = System.currentTimeMillis();
		String d = DateUtil.longToDate(lo);
		Date date = DateUtil.string2SqlDate(d);
		List<insertNextDay4EmpsVO> volist = m.selectAllEmp();
		CalendarPO po = m.selectDate_typeByDate(date);
		int state = 0;
		if (po.getDate_type() == 1) {
			state = 0;
		} else if (po.getDate_type() == 2) {
			state = 9;
		} else if (po.getDate_type() == 3) {
			state = 1;
		} else if (po.getDate_type() == 4) {
			state = 2;
		}
		int i = 0;
		for (insertNextDay4EmpsVO o : volist) {
			o.setDate(date);
			o.setState(state);
			m.insertNextDay4Emps(o);
			i++;
		}
		return i;
	}

	@Override
	public int selectCount(ApproveAttendanceVO vo) {
		return m.selectCount(vo);
	}

}
